package com.cpit.platform.commontable.service;

import com.cpit.platform.common.dao.SimpleExpression;
import com.cpit.platform.common.entity.Result;
import com.cpit.platform.common.entity.TableDataQueryCondition;
import com.cpit.platform.common.entity.TableJsonData;
import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.springframework.data.domain.Page;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;

public interface DataSourceCommonTableService {
    /**
     * 创建实体类
     * @param Map 要创建的实体类对象
     * @return 包含创建后的实体类的Result对象
     */
    Result<Map> create(String dbName,String tableName, Map Map);

    /**
     * 修改实体类
     * @param Map 要修改的实体类对象
     * @return 包含修改后的实体类的Result对象
     */
    Result<Map> modify(String dbName,String tableName, Map Map);

    /**
     * 修改部分属性值
     * @param id 主键ID
     * @param partFieldValueMap 待修改的属性名和修改后的值组成的Map
     * @return 包含修改后的实体类的Result对象
     */
    Result<Map> modify(String dbName,String tableName, Long id, Map<String, Object> partFieldValueMap);

    /**
     * 删除实体类
     * @param Map 要删除的实体类对象
     * @return Result对象
     */
    Result<Map>  delete(String dbName,String tableName, Map Map);

    /**
     * 删除实体类
     * @param id 主键ID
     */
    Result<Map>   delete(String dbName,String tableName, Long id);

    /**
     * 查询全部
     * @return 包含全部对象的列表
     */
    List<Map> findAll(String dbName,String tableName);

    /**
     * 根据主键ID查找实体类
     * @param id 主键ID
     * @return 实体类
     */
    Map findById(String dbName,String tableName, Long id);

    /**
     * 根据给定的实体类属性名值对组成的Map条件查询符合条件的记录列表
     * @param queryCondMap 实体类属性名值对组成的Map条件
     * @return 符合条件的记录列表
     */
    List<Map> findByQueryCondition(String dbName,String tableName, Map<String, Object> queryCondMap);

    /**
     * 根据给定的实体类属性名值对组成的Map条件查询符合条件的分页信息
     * @param page 当前页数， 以1开始
     * @param size 当前页的内容长度
     * @param order 排序方式：asc为升序，desc为降序
     * @param orderBy 排序字段，与对应entity中声明的字段名称一致
     * @param queryCondMap 实体类属性名值对组成的Map条件
     * @return 符合条件的分页信息
     */
    Page<Map> findByQueryCondition(String dbName,String tableName, int page, int size, String order, String orderBy, Map<String, Object> queryCondMap);

    /**
     * 由SimpleExpression组成的List条件查询所有符合条件的记录列表
     * @param queryCondSimple SimpleExpression组成的List条件
     * @return 符合条件的记录列表
     */
    List<Map> findByQueryCondition(String dbName,String tableName, List<SimpleExpression> queryCondSimple);


    /**
     * 由SimpleExpression组成的List条件查询所有符合条件的记录列表
     * @param simpleExpression SimpleExpression组成的条件
     * @return 符合条件的记录列表
     */
    List<Map> findByQueryCondition(String dbName,String tableName, SimpleExpression simpleExpression);
    /**
     * 由SimpleExpression组成的List条件查询所有符合条件的分页信息
     * @param page 当前页数， 以1开始
     * @param size 当前页的内容长度
     * @param order 排序方式：asc为升序，desc为降序
     * @param orderBy 排序字段，与对应entity中声明的字段名称一致
     * @param queryCondSimple SimpleExpression组成的List条件
     * @return 符合条件的分页信息
     */
    Page<Map> findByQueryCondition(String dbName,String tableName, int page, int size, String order, String orderBy, List<SimpleExpression> queryCondSimple);

    /**
     * 通过TableDataQueryCondition条件查询，返回jqGrid分页JSON形式
     * @param cond TableDataQueryCondition对象
     * @return TableJsonData对象
     */
    TableJsonData findByTableQueryCondition(String dbName,String tableName, TableDataQueryCondition cond);

    /**
     * 导出到到excel文件
     * @param request HttpServletRequest对象
     * @param response HttpServletResponse对象
     * @return
     */
    String export(String dbName,String tableName, HttpServletRequest request, HttpServletResponse response);

    /**
     * 导入文件内容
     * @param file
     * @param request
     * @return
     */
    public Result<Integer> fileImport(String dbName,String tableName, MultipartFile file, HttpServletRequest request);
}
